/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package model.produto;

import java.util.List;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceException;
import javax.persistence.Query;
import model.dao.IRepositorioProduto;
import model.daoimpl.GenericDAO;
import model.excecoes.ErroDAOException;

/**
 *
 * @author Marcos
 */
public class RepositorioProduto extends GenericDAO<Produto> implements IRepositorioProduto {

    
    @Override
    public void alterar(Produto produto)throws ErroDAOException, PersistenceException{
        Produto p = this.getManager().find(Produto.class, produto.getCodigo());
        p.setDescricao(produto.getDescricao());
        p.setMarca(produto.getMarca());
        p.setPrecoFinal(produto.getPrecoFinal());
        super.alterar(p);
    }
    
    @Override
    public void excluir(Produto produto)throws ErroDAOException, PersistenceException{
        Produto p = this.getManager().find(Produto.class, produto.getCodigo());
        super.excluir(p);
    }
    
    @Override
    public boolean verificarExistencia(String descricao, String marca) throws ErroDAOException, PersistenceException, NoResultException {
        boolean verificar = false;

        try {
            Query query = this.getManager().createQuery("Select p.descricao From Produto p Where p.descricao = :descricao and p.marca = :marca");
            query.setParameter("descricao", descricao);
            query.setParameter("marca", marca);
            if (!query.getResultList().isEmpty()) {
                verificar = true;
            }
        } catch (NoResultException ex) {
            throw new ErroDAOException("Erro de Consulta.\nDetalhes Técnicos:\n" + ex.getMessage());
        } catch (PersistenceException ex) {
            throw new ErroDAOException("Erro de Persistência.\nDetalhes Técnicos:\n" + ex.getMessage());
        }

        return verificar;
    }

    @Override
    public List<Produto> listarProduto(String consulta, String campo) throws ErroDAOException, PersistenceException, NoResultException {
        List<Produto> produtos = null;
        Query query = null;

        try {
            if (consulta.equals("Todos") && campo.equals("Todos")) {
                query = this.getManager().createQuery("Select p From Produto p");
            } else {
                if (campo.equals("Código")) {
                    query = this.getManager().createQuery("Select p From Produto p Where p.codigo = :codigo");
                    query.setParameter("codigo", Integer.parseInt(consulta));

                } else {
                    if(campo.equals("Descrição")){
                        query = this.getManager().createQuery("Select p From Produto p Where p.descricao = :descricao");
                        query.setParameter("descricao", consulta);
                    }else{
                        if(campo.equals("Marca")){
                            query = this.getManager().createQuery("Select p From Produto p Where p.marca = :marca");
                            query.setParameter("marca", consulta);
                        }
                    }
                }
            }
        } catch (NoResultException ex) {
            throw new ErroDAOException("Erro de Consulta.\nDetalhes Técnicos:\n" + ex.getMessage());
        } catch (PersistenceException ex) {
            throw new ErroDAOException("Erro de Persistência.\nDetalhes Técnicos:\n" + ex.getMessage());
        }

        produtos = query.getResultList();
        return produtos;
    }

}
